perm filename XREFS.SAI[PUB,TES] blob
sn#129314 filedate 1974-11-03 generic text, type T, neo UTF8
00100 BEGOF("XREFS")
00200
00300 COMMENT
00400
00500 *** Variations at Different Sites ***
00600
00700 TENEX PUB has a different naming scheme for intermediate files.
00800
00900 ***
01000
01100 Labels and cross-references. Page labels are the trickiest because
01200 they are always forward references, but they are resolved as soon as
01300 the page is written out.
01400
01500 ;
01600
01700 PROCEDURES
00100 PUBLIC SIMPLE PROCEDURE XREFS! ;$"#
00200 BEGIN "XREFS!"
00300 PLBL ← BRKPLBL ← -TWO(13) ;
00400 END "XREFS!" ;
00100 PUBLIC SIMPLE PROCEDURE FINIXREFS ;$"#
00200 BEGIN "FINIXREFS"
00300 COMMENT Write out Labels for Pass Two ;
00400 L ← WRITEON(FALSE, IFC TENEX THENC IFILENAME&".LABELS" ELSEC "PULABL"&PUIEXT ENDC) ;
00500 OUT(L, CVSR(XSYMNO MAX IHIGH) ) ;
00600 FOR J ← 1 THRU XSYMNO DO
00700 IF (BYTEWD ← NUMBER[J]) NEQ 0 AND (K← LDB(SYMBOLWD(BYTEWD))) = 0 OR K='17777 THEN
00800 IF LDB(PLIGHTWD(BYTEWD)) = 2 THEN OUT(L, CVSR(0) & CVSR(J) & STBL[LDB(IXWD(BYTEWD))]&ALTMODE )
00900 ELSE WARN("=","Undefined Label "&SYM[J]) ;
01000 FOR J ← 1 THRU IHIGH DO IF LH(BYTEWD ← ITBL[J]) = '400000 THEN
01100 OUT(L, CVSR(1) & CVSR(J) & STBL[LDB(IXWD(BYTEWD))] & ALTMODE) ;
01200 RELEASE(L) ;
01300 END "FINIXREFS" ;
00100 PUBLIC BOOLEAN SIMPLE PROCEDURE LABELDEF ;$"#
00200 IF NOT NEXTSCH(:) THEN RETURN(FALSE)
00300 ELSE IF NOT ON THEN
00400 BEGIN
00500 WHILE THISISID AND NEXTSCH(:) DO BEGIN PASS ; PASS END ;
00600 IF NOT NEXTSTATEMENT THEN E(0, 0) ; RETURN(TRUE) ;
00700 END
00800 ELSE
00900 BEGIN
01000 INTEGER LINK, PTR, PLIGHT, USYMB, WASSYMB, VALPTR ; STRING DEFVAL ;
01100 SIMPLE PROCEDURE CHECK!CONSISTENCY ;
01200 IF WASSYMB AND USYMB NEQ 0 AND LDB(IXN(WASSYMB)) NEQ LDB(IXN(ABS(USYMB))) THEN
01300 WARN("=",<"Label "&SYM[LINK]&" was cross-referenced as a "&
01400 SYM[WASSYMB]&" but is being defined as a "&
01500 SYM[ABS(USYMB)]>) ;
01600 LINK ← 0 ;
01700 DO BEGIN "MULTIPLE LABELS"
01800 PTR ← SYMNUM(THISWD&":") ; BYTEWD ← NUMBER[PTR] ;
01900 IF BYTEWD=0 OR ( PLIGHT ← LDB(PLIGHTWD(BYTEWD)) ) = 1 THEN
02000 BEGIN NUMBER[PTR] ← BYTEWD LSH 13 LOR LINK ; LINK ← PTR END
02100 ELSE WARN("=",<"Label "&SYM[PTR]&" is already defined as "&
02200 (IF PLIGHT=2 THEN STBL[IX] ELSE "a recent page number")>) ;
02300 PASS ; PASS ;
02400 END "MULTIPLE LABELS"
02500 UNTIL NOT (THISISID AND NEXTSCH(:)) ;
02600 IF LINK = 0 THEN RETURN(TRUE) ; TES 11/29/73 ;
02700 DEFVAL ← IF (USYMB←NEXTSTATEMENT)=0 THEN E(0,0)
02800 ELSE IF USYMB>TWO(13) THEN "??"
02900 ELSE IF USYMB>0 THEN C! ELSE !;
03000 IF EQU(DEFVAL,0) OR USYMB = SYMPAGE THEN
03100 DO BEGIN "PAGE LABELS"
03200 NUMBER[LINK] SWAP PLBL ; WASSYMB ← PLBL LSH -13 ;
03300 CHECK!CONSISTENCY ;
03400 PLBL SWAP LINK ; LINK ← LINK LAND '17777 ; PLBL ← -PLBL ;
03500 END "PAGE LABELS"
03600 UNTIL LINK=0
03700 ELSE BEGIN "OTHER COUNTER"
03750 IF XCRIBL THEN COMPMAXIMS ; TES 11/2/74 SO XLENGTH WON'T COMPLAIN ;
03800 VALPTR ← 2 ROT -2 LOR PUTS(DEFVAL&(IF XCRIBL THEN ALTMODE&CVS(XLENGTH(DEFVAL)) ELSE NULL)) ;
03900 DO BEGIN
04000 PTR ← VALPTR ; NUMBER[LINK] SWAP PTR ; WASSYMB ← PTR LSH -13 ;
04100 CHECK!CONSISTENCY ;
04200 LINK ← PTR LAND '17777 ;
04300 END
04400 UNTIL LINK=0 ;
04500 END "OTHER COUNTER" ;
04600 RETURN(TRUE) ;
04700 END "LABELDEF" ;
00100 PUBLIC STRING SIMPLE PROCEDURE LABELREF(INTEGER USYMB, LEN) ;$"#
00200 IF NOT ON THEN RETURN(NULL) ELSE
00300 BEGIN "LABELREF"
00400 INTEGER PTR, PLIGHT, WASSYMB ; STRING S ;
00500 IF NULSTR(THISWD) THEN COMMENT, Generated Label for {PAGE}. USYMB=0.;
00600 PTR ← (PLBL ← PUTI(1, PLBL)) LOR TWO(14) COMMENT Add to Linked List ;
00700 ELSE IF BYTEWD ← NUMBER[ PTR ← SYMNUM(THISWD & ":") ] THEN
00800 BEGIN "KNOWN LABEL"
00900 CASE (PLIGHT ← LDB(PLIGHTWD(BYTEWD))) MOD 3 OF
01000 BEGIN COMMENT BY PLIGHT ;
01100 COMMENT 0 or 3 ... Page Label still Uncertain ; WASSYMB ← SYMPAGE ;
01200 COMMENT 1 ... Referenced but not defined ; WASSYMB ← LDB(IXWD(BYTEWD)) ;
01300 COMMENT 2 ... Defined and Certain ;
01400 BEGIN
01500 BREAKSET(LOCAL!TABLE,ALTMODE,"IS");
01600 BREAKSET(LOCAL!TABLE,NULL,"O");
01700 S ← STBL[LDB(IXWD(BYTEWD))] ;
01800 RETURN (SCAN(S,LOCAL!TABLE,DUMMY));
01900 END;
02000 END ; COMMENT BY PLIGHT ;
02100 IF USYMB AND LDB(IXN(USYMB)) NEQ LDB(IXN(WASSYMB)) THEN
02200 BEGIN "DIFFERENT COUNTER"
02300 IF WASSYMB THEN WARN("X-REF ERROR",<"Label "&SYM[PTR]&
02400 " was cross-referenced as a "&SYM[WASSYMB]&
02500 " earlier, but now as a "&SYM[USYMB]>) ;
02600 IF PLIGHT = 1 THEN NUMBER[PTR] ← 1 ROT -2 LOR USYMB ;
02700 END "DIFFERENT COUNTER" ;
02800 END "KNOWN LABEL"
02900 ELSE NUMBER[PTR] ← 1 ROT -2 LOR USYMB ;
03000 RETURN(RUBOUT & CVS(LEN) & VT & CVS(PTR) & VT) ;
03100 END "LABELREF" ;
00100 FINISHED
00200
00300 ENDOF("XREFS")